package br.com.sebrae.pr.sgp.util;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.text.MessageFormat;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

/**
 * Classe com métodos úteis para manipulação de {@link String}s.
 * 
 * @author Tanaka
 * 
 */
public abstract class CustomStringUtils extends StringUtils{

    private CustomStringUtils() {
    }

    /**
     * Substitui os wildcards ({0}, {1}, etc) pelas Strings respectivas do params
     * 
     * @param msg
     *            mensagem Ex.: {0} efetuada com sucesso.
     * @param params
     *            strings para substituição Ex.: new String[]{"Alteração"};
     * @return Alteração efetuada com sucesso.
     */
    public static final String replace(final String msg, final String[] params) {
        if (StringUtils.isBlank(msg)) {
            return null;
        } else if (ArrayUtils.isEmpty(params)) {
            return msg;
        }
        String msgRet = "";
        if (StringUtils.isNotBlank(msg) && !ArrayUtils.isEmpty(params)) {
            msgRet = MessageFormat.format(msg.replaceAll("'", "\""), (Object[]) params);
        }
        return msgRet.trim();
    }

    /**
     * Substitui todas as quebras de linha \r\n, \n, etc por <br />
     * 
     * @param str
     * @return
     */
    public static final String substituiLineBreaksPorBR(final String str) {
        if (StringUtils.isBlank(str)) {
            return "";
        }
        return str.replaceAll("(\r\n|\n\r|\r|\n)", "<br />");
    }
    

    /**
     * Converte o stacktrace da excessao para String.
     * 
     * @param t
     * @return
     */
    public static String getStackTrace(final Throwable t) {
        final Writer w = new StringWriter();
        final PrintWriter pw = new PrintWriter(w);
        t.printStackTrace(pw);
        return w.toString();
    }

    /**
     * Capitaliza as palavras de determinada string.
     * 
     * @param str
     * @return
     */
    public static String capitalizar(final String str) {
        StringBuilder retorno = new StringBuilder();
        final String[] nmes = str.split(" ");
        for (String s : nmes) {
            if (s.length() > 1) {
                retorno.append(s.substring(0, 1).toUpperCase()).append(s.substring(1).toLowerCase()).append(" ");
            } else {
                retorno.append(s.toLowerCase()).append(" ");
            }
        }
        return retorno.toString();
    }

    /**
     * Remove todos os espaÃ§os de determinada string.
     * 
     * @param text
     * @return
     */
    public static String removeEspacos(final String text) {
        return text.replaceAll(" ", "");
    }

    /**
     * Converte determinado telefone para String (numDDD) 9999-9999
     * 
     * @param numDDD
     * @param numTelefone
     * @return
     */
    public static String toTelefoneStr(final String numTelefone) {
        if (isBlank(numTelefone) || !isNumeric(numTelefone) || numTelefone.length() < 10) {
            return numTelefone;
        }
        return "(" + numTelefone.substring(0, 2) + ") " + numTelefone.substring(2, 6) + "-" + numTelefone.substring(6);
    }

    public static String substituiBarrasDuplasPorSimples(String path) {
        if (isBlank(path)) {
            return path;
        }
        while (path.contains("//")) {
            path = path.replace("//", "");
        }
        return path;
    }
}
